#ifndef LINKED_LIST_H
#define LINKED_LIST_H

#include "simple.h"

struct ll_node
{
	elem_t data;
	struct ll_node * next;
};
typedef struct ll_node ll_node;

typedef ll_node * l_list;
typedef ll_node const * const_l_list;
typedef ll_node * ll_iterator;
typedef ll_node const * const_ll_iterator;

ll_node * ll_node_create(elem_t e);
void ll_node_release(ll_node * node);

l_list l_list_clone(const_l_list l);
void l_list_release(l_list l);

size_t l_list_len(const_l_list l);

#define l_list_empty(l) (l)

l_list l_list_append(l_list * l, elem_t * p, size_t len);

void l_list_display(const_l_list l);

int l_list_get(const_l_list l, index_t i, elem_t * e);
index_t l_list_locate(const_l_list l, elem_t e);

ll_iterator l_list_insert(ll_iterator it, elem_t e);

/*
 * will delte prev->next
 */
ll_iterator l_list_delete(ll_iterator prev, elem_t * e);

l_list l_list_sort(l_list * l);

l_list l_list_reverse(l_list * l);

#endif /* LINKED_LIST_H */

